package com.ipzoe.common.util;


import java.time.LocalDateTime;

/**
 * 基础Service
 * <p>
 * Created on 2017/08/29.
 *
 * @author pfzhang
 */
public class DefaultService<T extends BaseEntity> {

    private DefaultMapper<T> defaultMapper;

    public void setDefaultMapper(DefaultMapper<T> defaultMapper) {
        this.defaultMapper = defaultMapper;
    }

    /**
     * 保存一个实体，null的属性也会保存，不会使用数据库默认值
     *
     * @param creator 更新人
     * @param entity  实体
     */
    public void insert(String creator, T entity) {
        LocalDateTime now = LocalDateTime.now();
        entity.setDelFlag(false);
        entity.setCreator(creator);
        entity.setCreateTime(now);
        entity.setModifier(creator);
        entity.setModifyTime(now);
        defaultMapper.insert(entity);
    }

    /**
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     *
     * @param creator 更新人
     * @param entity  实体
     */
    public void insertSelective(String creator, T entity) {
        LocalDateTime now = LocalDateTime.now();
        entity.setDelFlag(false);
        entity.setCreator(creator);
        entity.setCreateTime(now);
        entity.setModifier(creator);
        entity.setModifyTime(now);
        defaultMapper.insertSelective(entity);
    }

    /**
     * 根据主键更新实体全部字段，null值会被更新
     *
     * @param modifier 更新人
     * @param entity   实体
     */
    public void update(String modifier, T entity) {
        entity.setModifier(modifier);
        entity.setModifyTime(LocalDateTime.now());
        defaultMapper.updateByPrimaryKey(entity);
    }

    /**
     * 根据主键更新属性不为null的值
     *
     * @param modifier 更新人
     * @param entity   实体
     */
    public void updateSelective(String modifier, T entity) {
        entity.setModifier(modifier);
        entity.setModifyTime(LocalDateTime.now());
        defaultMapper.updateByPrimaryKeySelective(entity);
    }

    /**
     * 根据主键字段进行删除
     *
     * @param id ID
     */
    public void delete(Long id) {
        defaultMapper.deleteByPrimaryKey(id);
    }

    /**
     * 根据主键ID获取实体对象
     *
     * @param id ID
     * @return 实体对象
     */
    public T selectById(Long id) {
        return defaultMapper.selectByPrimaryKey(id);
    }
}
